package org.example.system.config;

import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
import cn.binarywang.wx.miniapp.config.WxMaConfig;
import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl;
import cn.binarywang.wx.miniapp.constant.WxMaConstants;
import com.github.binarywang.wxpay.config.WxPayConfig;
import com.github.binarywang.wxpay.constant.WxPayConstants;
import com.github.binarywang.wxpay.service.WxPayService;
import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.DependsOn;
import org.springframework.stereotype.Component;

/**
 * 微信小程序配置类
 */
@Getter
@Setter
@Component
@ConfigurationProperties(prefix = "wx")
public class WechatConfig {
    /**
     * AppID(小程序ID)
     */
    private String appId;

    /**
     * AppSecret(小程序密钥)
     */
    private String appSecret;

    /**
     * 商户号
     */
    private String mchId;

    /**
     * 商户密钥
     */
    private String  mchKey;

    /**
     * 支付结果通知
     */
    private String notifyUrl;

    /**
     * 退款结果通知
     */
    private String refundUrl;

    /**
     * p12证书路径
     */
    private String keyPath;
    private String privateKeyPath;
    private String privateCertPath;


    /**
     * 微信支付服务组件
     * @return
     */
    @Bean
    public WxPayService wxPayService() {
        WxPayConfig wxPayConfig = new WxPayConfig();
        /**
         * 配置AppId
         */
        wxPayConfig.setAppId(StringUtils.trimToNull(getAppId()));
        /**
         * 配置商户号
         */
        wxPayConfig.setMchId(StringUtils.trimToNull(getMchId()));
        /**
         * 配置商户密钥
         */
        wxPayConfig.setMchKey(StringUtils.trimToNull(getMchKey()));

        /**
         * 配置支付回调地址
         */
        wxPayConfig.setNotifyUrl(StringUtils.trimToNull(getNotifyUrl()));


        /**
         * 申请退款相关配置项
         */
        wxPayConfig.setKeyPath(StringUtils.trimToNull(getKeyPath()));
        wxPayConfig.setPrivateKeyPath(StringUtils.trimToNull(getPrivateKeyPath()));
        wxPayConfig.setPrivateCertPath(StringUtils.trimToNull(getPrivateCertPath()));

        /**
         * 配置是否使用沙箱环境,false 真实支付环境，true 表示沙箱环境
         */
        wxPayConfig.setUseSandboxEnv(false);
        /**
         *  签名类型，默认为MD5，支持HMAC-SHA256和MD5。
         */
        wxPayConfig.setSignType(WxPayConstants.SignType.MD5);

        WxPayService wxPayService = new WxPayServiceImpl();
        wxPayService.setConfig(wxPayConfig);
        return wxPayService;
    }


    /**
     * 微信小程序配置组件
     * @return
     */
    @Bean(name = "wxMaConfig")
    public WxMaConfig wxMaConfig(){
        WxMaDefaultConfigImpl wxMaConfig = new WxMaDefaultConfigImpl();
        wxMaConfig.setAppid(appId);
        wxMaConfig.setSecret(appSecret);
        wxMaConfig.setMsgDataFormat(WxMaConstants.MsgDataFormat.JSON);
        return  wxMaConfig;
    }

    /**
     * 微信授权登录组件
     * @param wxMaConfig
     * @return
     */
    @Bean(name = "wxMaService")
    @DependsOn(value = {"wxMaConfig"})
    public WxMaService wxMaService(@Qualifier(value = "wxMaConfig") WxMaConfig wxMaConfig){
        WxMaService wxMaService = new WxMaServiceImpl();
        wxMaService.setWxMaConfig(wxMaConfig);
        return wxMaService;
    }
}
